home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / l / inet-handler / muldiv.h < prev    next >
C/C++ Source or Header  |  1994-04-05  |  3KB  |  93 lines

  1. /*
  2.  * stripped from ixemul.library source file gnulib/common.h 
  3.  */
  4.  
  5. #ifndef _MULDIV_H_
  6. #define _MULDIV_H_
  7.  
  8. /*
  9. #include <exec/types.h>
  10. #undef FLOAT
  11.  
  12. #include "types.h"
  13. #define FLOAT SFVALUE
  14.  
  15. #define lowpart(a) ((unsigned short)a)
  16. #define highpart(a) ((unsigned short)((a)>>16))
  17. */
  18.  
  19. static inline unsigned long
  20. mulu (unsigned long u, unsigned long v)
  21. {
  22.   register unsigned long result asm("d0");
  23.  
  24.   asm volatile ("
  25.     movel    %1,d0
  26.     movel    %2,d1
  27.     movel    d0,d2
  28.     movel    d1,d3
  29.     swap    d2
  30.     swap    d3
  31.     mulu    d1,d2
  32.     mulu    d0,d3
  33.     mulu    d1,d0
  34.     addw    d3,d2
  35.     swap    d2
  36.     clrw    d2
  37.     addl    d2,d0"
  38.     : "=r" (result)
  39.     : "g" (u), "g" (v)
  40.     : "d0", "d1", "d2", "d3");
  41.   return result;
  42. }
  43.  
  44. #define divmodu(q, r, n, d) \
  45. ({ register unsigned long rq asm("d0"), rr asm("d1");    \
  46.                             \
  47.    asm volatile ("                    \
  48.        movel    %2,d0;                    \
  49.        movel    %3,d1;                    \
  50.     cmpl    #0xffff,d1;                \
  51.     bhi    full_division;                \
  52.     movel    d1,d3;                    \
  53.     swap    d0;                                      \
  54.     movew    d0,d3;                                   \
  55.     beq    L12345;                                  \
  56.     divu    d1,d3;                                   \
  57.     movew    d3,d0;                                   \
  58.    L12345:                                               \
  59.     swap    d0;                                      \
  60.     movew    d0,d3;                                   \
  61.     divu    d1,d3;                                   \
  62.     movew    d3,d0;                                   \
  63.     swap    d3;                                      \
  64.     movew    d3,d1;                                   \
  65.     bra    common_end;                              \
  66.                                                         \
  67.    full_division:                                       \
  68.     movel    d1,d3;                                   \
  69.     movel    d0,d1;                                   \
  70.     clrw    d1;                                      \
  71.     swap    d1;                                      \
  72.     swap    d0;                                      \
  73.     clrw    d0;                                      \
  74.     moveq    #15,d2;                                  \
  75.    divloop:                                             \
  76.     addl    d0,d0;                                   \
  77.     addxl    d1,d1;                                   \
  78.     cmpl    d1,d3;                                   \
  79.     bhi    L12346;                                  \
  80.     subl    d3,d1;                                   \
  81.     addqw    #1,d0;                                   \
  82.    L12346:                                               \
  83.     dbra    d2,divloop;                              \
  84.                                                         \
  85.    common_end:"                                         \
  86.    : "=r" (rq), "=r" (rr)                               \
  87.    : "g" (n), "g" (d)                                   \
  88.    : "d0", "d1", "d2", "d3");                           \
  89.    q = rq; r = rr;})
  90.  
  91.  
  92. #endif /* _MULDIV_H_ */
  93.